package nl.saxion.webtech.roulette.webservice;

import java.util.ArrayList;

import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import nl.saxion.webtech.roulette.model.Bet;
import nl.saxion.webtech.roulette.model.Lobby;
import nl.saxion.webtech.roulette.model.Player;
import nl.saxion.webtech.roulette.model.Table;
import nl.saxion.webtech.roulette.model.info.PlayerSummary;
import nl.saxion.webtech.roulette.model.info.TableSummary;

@Path( "/table" )
public class TableService {

	@GET
	@Path( "{tableId}" )
	@Produces( MediaType.APPLICATION_JSON )
	public Table getTable( @PathParam( "tableId" ) int tableId ) {
		return Lobby.getInstance().getTable( tableId );
	}

//	@GET
//	@Path("makeBet")
//	public Bet makeBet() {
//		return new Bet( 1, 10, true );
//	}
	
	// De delete methode is idempotent, het verplicht dat de server een status 200(OK) teruggeeft zelfs als de server de resource heeft verwijderd bij een vorig request..
	@DELETE
	@Path( "{tableId}/{playerId}" )
	@Produces( MediaType.APPLICATION_JSON )
	public TableSummary leaveTable( @PathParam( "tableId" ) int tableId, @PathParam( "playerId" ) int playerId ) {
		// Remove player from table
		Lobby.getInstance().getTable( tableId ).removePlayer( playerId );
		
		// standaard roulette tafel info ipv een void; nu geen status 204 - No Content
		Table table = Lobby.getInstance().getTable( tableId );
		ArrayList<PlayerSummary> playersInfo = new ArrayList<PlayerSummary>();
		for( Player player : table.getPlayers() ) {
			playersInfo.add( new PlayerSummary( player.getUsername(), player.getAmountOfCash(), player.getPlayerId() ) );
		}
		return new TableSummary( tableId, playersInfo.size(), playersInfo );
		
	}

	// Deze methode kun je aanroepen door /table/<tableID> te doen en in een post parameter een JSONObject van een Bet class mee te sturen.
	@POST
	@Path("{tableId}")
	@Consumes( MediaType.APPLICATION_JSON )
	@Produces(MediaType.APPLICATION_JSON)
	public Table makeBet( Bet bet, @PathParam( "tableId" ) String tableId ) {
		
		Table currentTable = Lobby.getInstance().getTable( Integer.parseInt( tableId ) );
		ArrayList<Player> players = currentTable.getPlayers();		
		for( Player player : players ) {
			// Make bet for player!
			if( player.getPlayerId() == bet.getPlayerId() ) {
				player.placeBet( bet );
				return currentTable;
			}
		}
		return null;
	}
	
	@POST
	@Produces(MediaType.APPLICATION_JSON)
	public TableSummary joinTable( @FormParam( "tableId" ) String tableId, @FormParam( "playerId" ) String playerId ) {
		// Neem deel aan tafel
		Lobby.getInstance().getPlayer( Integer.parseInt( playerId ) ).joinTable( Integer.parseInt( tableId ), 250 );
		
		// standaard roulette tafel info ipv een void; nu geen status 204 - No Content
		Table table = Lobby.getInstance().getTable( Integer.parseInt( tableId ) );
		ArrayList<PlayerSummary> playersInfo = new ArrayList<PlayerSummary>();
		for( Player player : table.getPlayers() ) {
			playersInfo.add( new PlayerSummary( player.getUsername(), player.getAmountOfCash(), player.getPlayerId() ) );
		}
		return new TableSummary( Integer.parseInt( tableId ), playersInfo.size(), playersInfo );
	}

}
